{{tag>administration serveur ssh}}
----
====== PSSH (parallel-ssh) ======
    
**Pssh** est un outil en ligne de commande pour exécuter des commandes unix via **ssh** en parallèle sur plusieurs hôtes. Ses spécialités comprennent:
  *     Envoi de données à tous les clients
  *     Saisie unique d'un mot de passe pour ssh
  *     Enregistrement de la sortie dans des fichiers ou visionnage direct
  *     Automatisation des tâches **sysadmin** telles que l'application de correctifs aux serveurs, les mises à jour, l'installation de paquets, la configuration,...
  * Envoi de fichiers à tous les serveurs
  * Gestion des processus
  * Compatible avec tous les Linux, Unix et freeBSD

Ce logiciel est très utile sur un parc de PC, puisque vous mettez à jour l'ensemble du parc depuis une seule machine.

====== Configurer les postes clients ======
<note tip>Il est possible d'écrire un script d'automatisation afin d'alléger cette tâche.</note>
Sur chaque postes clients il s'agira de : 

  * [[:tutoriel:comment_installer_un_paquet|Installez]] le **[[:ssh?#installation_du_serveur_ssh|serveur SSH]]**. Chaque client possédera donc son propre serveur ssh.
  * Configurer ces serveurs ssh pour qu'il accepte les connexions root et les autorisations par clefs et non mot de passe :
     * avec les [[:sudo|droits d'administration]], [[:tutoriel:comment_modifier_un_fichier|modifiez le fichier]] **/etc/ssh/sshd_config** pour mettre à jour les lignes suivantes avec ces entrées : <file bash>
PermitRootLogin yes
PubkeyAuthentication yes</file>
  * Démarrer ou redémarrer le [[:services|service]] ssh. Il faut généralement les droits administrateur.
    * Par exemple <code bash>sudo service ssh start</code> ou <code>sudo service ssh restart</code>

Les clients sont prêts à l'emploi

====== Configuration de la machine maître ======
===== Installer pssh =====

[[:tutoriel:comment_installer_un_paquet|Installez]] [[apt>pssh]]
 
===== pssh / parallel-ssh =====

Sous debian sid, l'utiliaire **pssh** s'appelle **parallel-ssh** (sous d'autres distributions c'est simplement **pssh**).

Ici nous utiliserons **parallel-ssh** par défaut (adapter à votre configuration)

===== Utiliser une paire de clef publique/privée pour l’identification ssh =====

Construire sa clef , sauf si on en a déjà une (compte $USER, non en root)
<code bash>ssh-keygen</code> 
Vérifiez par <code bash>ls -l .ssh/ </code>
qui doit vous retourner
<code>
total 12
-rw------- 1 ragnarok cyrille 1876 juin  26  2019 id_rsa
-rw-r--r-- 1 ragnarok cyrille  397 juin  26  2019 id_rsa.pub
-rw-r--r-- 1 ragnarok cyrille 2220 mars  14 16:42 known_hosts</code>

La clé est créée, on la garde sous le coude ;)

===== Le fichier de configuration du poste maître =====

Ce fichier renferme la liste des hosts vers lesquels les commandes seront envoyées.

Ici, cette liste sera stockée dans  **/etc/ssh/pssh_host** mais vous pouvez créer un fichier de ce type où vous le souhaitez (souvent, le fichier **~/.pssh_hosts_files** est utilisé)

Créer un fichier contenant les hosts
<code bash>mkdir /etc/ssh/pssh_host</code>
Modifiez le ensuite. Par exemple avec [[:nano]] si vous êtes sur une [[:console]])
<code>nano /etc/ssh/pssh_host/pssh</code>
<file bash>
###Mettre les adresses IP des serveurs à administrer ici.
root@192.168.0.11
root@192.168.0.12
root@192.168.0.23
root@192.168.0.43
...</file>

Si vous souhaitez utiliser les noms des machines plutôt que leurs adresses IP, il faudra modifier et adapter le fichier **/etc/hosts**

===== Exporter la clef publique sur les clients =====

Toujours en mode $USER

<code bash>ssh-copy-id root@192.168.0.11
ssh-copy-id root@192.168.0.12
ssh-copy-id root@192.168.0.23
ssh-copy-id root@192.168.0.43
...</code>
Autant de fois que d'entrées dans votre fichier **/etc/ssh/pssh_host/pssh**

<code bash>ssh-copy-id root@192.168.0.43</code>
<code>
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/ragnarok/.ssh/id_rsa.pub"
The authenticity of host '192.168.0.43 (192.168.0.43)' can't be established.
ECDSA key fingerprint is SHA256:2SC8wDSd7m7UrqCRnmz6jsY+6K9GL9zkMPQZGxEQM6k.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.0.43's password:
Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'root@192.168.0.43'"
and check to make sure that only the key(s) you wanted were added.</code>

FIXME root@192.168.0.43's password on ne doit pas saisir le mdp de la machine distante/cliente ? 


====== Déployer pssh ======

===== Initialiser pssh =====

Utilisez **ssh-agent** pour vous authentifier automatiquement (avec un nom de shell comme argument pour que les variables d'environnement de l'agent soient définies dans ce nouveau shell). 
Ajoutez la clé avec **ssh-add** et tapez votre mot de passe __une seule fois__. FIXME pas forcément le mot de passe de la machine mais une mot de passe nouvellement choisi non ? 

<code bash>ssh-agent bash
ssh-add
Enter passphrase for /xxxx/.ssh/identity:</code> 


===== Utiliser parallel-ssh =====

==== L'option -i ====


<code bash>parallel-ssh -i  -h /etc/ssh/pssh_host/pssh_hosts uname -a</code>
Répondra
<code>
[1] 15:21:04 [SUCCESS] root@192.168.0.11
FreeBSD asgard-freeBSD 12.0-RELEASE-p13 FreeBSD 12.0-RELEASE-p13 GENERIC  amd64
[2] 15:21:04 [SUCCESS] root@192.168.0.43
Linux Tinuviel-debianStable 4.19.0-6-amd64 #1 SMP Debian 4.19.67-2+deb10u2 (2019-11-11) x86_64 GNU/Linux
</code>

On remarque ici **l'option -i** qui permet de visualiser ce que retourne le terminal ssh des postes clients

==== L'option -o ====

Pour **rediriger la sortie ssh des clients vers un fichier**, on utilisera l'**option -o**

<code bash>parallel-ssh -o /tmp/uname  -h /etc/ssh/pssh_host/pssh_hosts uname -a</code>
Répondra
<code>
[1] 15:22:47 [SUCCESS] root@192.168.0.11
[2] 15:22:48 [SUCCESS] root@192.168.0.43</code>

Et pour visualiser les sorties.

<code>cat /tmp/uname/root@192.168.0.11 /tmp/uname/root@192.168.0.43</code>
Répondra
<code>
FreeBSD asgard-freeBSD 12.0-RELEASE-p13 FreeBSD 12.0-RELEASE-p13 GENERIC  amd64
Linux Tinuviel-debianStable 4.19.0-6-amd64 #1 SMP Debian 4.19.67-2+deb10u2 (2019-11-11) x86_64 GNU/Linux</code>

==== Mise à jour à distance ====

<code bash>parallel-ssh -i  -h /etc/ssh/pssh_host/pssh_hosts apt update
parallel-ssh -i  -h /etc/ssh/pssh_host/pssh_hosts apt full-upgrade</code>

:!: Attention ici il s'agit de la commande [[:apt]], à adapter selon votre gestionnaire de paquet :!:

==== Copier des fichiers vers les clients ====

__Syntaxe__
<code bash>parallel-scp -h /fichier_de_conf_pssh source destinatire</code>

__Exemple__
<code bash>parallel-scp  -h /etc/ssh/pssh_host/pssh_hosts  $HOME/test.txt /tmp/</code>

==== Tuer des processus sur les postes clients ====

__Syntaxe__
<code bash>parallel-nuke -h /fichier_de_conf_pssh nom_du_processus</code>

__Exemple__
<code bash>parallel-nuke  -h /etc/ssh/pssh_host/pssh_hosts  nginx</code>

---- 
//[[:utilisateurs:cyrille|cyrille]] AT cbiot DOT fr//